<html>
    <head>
        <meta charset="UTF-8">
        <title>函数的方法</title>
        <script type="text/javascript">
            function fun()
            {
                alert(this.name);
            }

            /*
                call()和apply()
                    这两个方法都是函数对象的方法，都需要通过函数对象来调用
                    当对函数调用call()和apply()都会调用函数执行
                    在调用call()和apply()可以将一个对象指定为第一个参数
                        此时这个对象将会成为函数执行时的this
                    call()方法可以将实参在对象之后依次传递
                    apply()方法需要将实参封装到一个数组中统一传递

                this的情况：
                    1.以函数形式调用时，this永远都是Window
                    2.以方法的形式调用时，this调用的是方法的对象
                    3.以构造函数的形式调用时，this是新创建的那个对象
                    4.使用call个apply调用时，this是指定的那个对象
            */

            var obj = {
                name : "obj",
                sayName:function()
                {
                    alert(this.name);
                }
            };

            var obj2 = {
                name : "obj2"
            };

            //fun.call(obj2);
            //obj.sayName.apply(obj2);


            /*
                封装实参的对象 arguments
                    arguments是一个类数组对象，它可以通过索引来操作数据，也可以获取长度
                    在调用函数时，我们所传递的实参都会在arguments中保存
                    arguments.length可以用来获取实参的长度
                    既是不定义形参，也可以通过arguments调用实参，只不过比较麻烦
                    它里面有一个属性叫做callee
                        这个属性对应一个函数对象，就是当前正在指向的函数对象
            */

            function fun2()
            {
                //3
                console.log(arguments.length);
                //002
                console.log(arguments[1]);
            }

            fun2("001", "002", false);
        </script>
    </head>

    <body>

    </body>
</html>